﻿using EntitiesLayer;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DataAccessLayer
{
    public class DataTableGeneric
    {
        private static readonly String connectionString = @"Data Source=(localdb)\Projects;Initial Catalog=QuidditchDatabase;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False";

        #region Table Coupe

        #region Constantes Table Coupe
        // Constantes : Nom des tables, Nom de la table, Nombre de champs dans la table
        private const string TABLE_BDD_COUPE = "COUPE";
        private const int NB_COL_COUPE = 3;
        private const string COL_BDD_ID_COUPE = "ID";
        private const string COL_BDD_NOM_COUPE = "NOM";
        private const string COL_BDD_ANNE_COUPE = "ANNEE";
        #endregion

        #region Méthodes Génériques Table Coupe

        /// <summary>
        /// Permet d'initialiser une DataTable avec toutes les colonnes associés à la table Coupe
        /// </summary>
        /// <returns>Retourne une DataTable correctement initialisé</returns>
        private static DataTable CreateDataTableCoupe()
        {
            DataTable dt = new DataTable();
            dt.Columns.Add(COL_BDD_ID_COUPE, typeof(Int32));
            dt.Columns.Add(COL_BDD_NOM_COUPE, typeof(String));
            dt.Columns.Add(COL_BDD_ANNE_COUPE, typeof(Int32));
            return dt;
        }

        /// <summary>
        /// Permet de retourner un tableau d'objet en lisant une ligne remonté de la requête
        /// </summary>
        /// <param name="dr">Ligne de données</param>
        /// <returns>Retourne un tableau d'objet formatté selon la disposition des colonnes de la table</returns>
        private static object[] FillCoupe(IDataReader dr)
        {
            object[] tab = new object[NB_COL_COUPE];
            tab[0] = Convert.ToInt32(dr[COL_BDD_ID_COUPE]);
            tab[1] = Convert.ToString(dr[COL_BDD_NOM_COUPE]);
            tab[2] = Convert.ToInt32(dr[COL_BDD_ANNE_COUPE]);
            return tab;
        }

        /// <summary>
        /// Retourne une DataTable selon un requête passée en paramètre
        /// </summary>
        /// <param name="request">Requête demandée</param>
        /// <returns>Retourne les données associées à cette requête</returns>
        public static DataTable BuildDataTableByRequestForCoupe(String request)
        {
            DataTable dt = CreateDataTableCoupe();

            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                connection.Open();

                SqlCommand command = new SqlCommand(request, connection);

                SqlDataReader reader = command.ExecuteReader();

                while (reader.Read()) dt.LoadDataRow(FillCoupe(reader), true);

                connection.Close();
            }

            return dt;
        }

        /// <summary>
        /// Construit une ligne à partir d'une coupe
        /// </summary>
        /// <param name="coupe">Objet à transformer</param>
        /// <returns>Retourne un tableau d'objet dans l'odre des colonnes de la table Coupe</returns>
        public static object[] BuildRowByCoupe(Coupe coupe)
        {
            object[] tab = new object[NB_COL_COUPE];
            tab[0] = coupe.ID;
            tab[1] = coupe.Name;
            tab[2] = coupe.Year;
            return tab;
        }

        /// <summary>
        /// Retourne le nom de la table
        /// </summary>
        /// <returns></returns>
        public String FromCoupe()
        {
            return TABLE_BDD_COUPE;
        }

        /// <summary>
        /// Retourne les champs de la table Coupe
        /// </summary>
        /// <returns></returns>
        public String ValuesCoupe()
        {
            return COL_BDD_ID_COUPE + "," + COL_BDD_NOM_COUPE + "," + COL_BDD_ANNE_COUPE;
        }

        #endregion

        #endregion

        #region Table Joueur

        #region Constantes Table Joueur
        // Constantes : Nom des tables, Nom de la table, Nombre de champs dans la table
        private const string TABLE_BDD_JOUEUR = "PLAYER";
        private const int NB_COL_JOUEUR = 8;
        private const string COL_BDD_ID_JOUEUR = "ID";
        private const string COL_BDD_NOM_JOUEUR = "NOM";
        private const string COL_BDD_PRENOM_JOUEUR = "PRENOM";
        private const string COL_BDD_DATENAISSANCE_JOUEUR = "DATENAISSANCE";
        private const string COL_BDD_POSTE_JOUEUR = "POSTE";
        private const string COL_BDD_NOMBRE_SELECTIONS_JOUEUR = "NOMBRESELECTIONS";
        private const string COL_BDD_SCORE_JOUEUR = "SCORE";
        private const string COL_BDD_EQUIPE_ID_JOUEUR = "EQUIPEID";

        #endregion

        #region Méthodes Génériques Table Joueur

        /// <summary>
        /// Permet d'initialiser une DataTable avec toutes les colonnes associés à la table Joueur
        /// </summary>
        /// <returns>Retourne une DataTable correctement initialisé</returns>
        private static DataTable CreateDataTableJoueur()
        {
            DataTable dt = new DataTable();
            dt.Columns.Add(COL_BDD_ID_JOUEUR, typeof(Int32));
            dt.Columns.Add(COL_BDD_NOM_JOUEUR, typeof(String));
            dt.Columns.Add(COL_BDD_PRENOM_JOUEUR, typeof(String));
            dt.Columns.Add(COL_BDD_DATENAISSANCE_JOUEUR, typeof(DateTime));
            dt.Columns.Add(COL_BDD_POSTE_JOUEUR, typeof(Int32));
            dt.Columns.Add(COL_BDD_NOMBRE_SELECTIONS_JOUEUR, typeof(Int32));
            dt.Columns.Add(COL_BDD_SCORE_JOUEUR, typeof(Int32));
            dt.Columns.Add(COL_BDD_EQUIPE_ID_JOUEUR, typeof(Int32));
            return dt;
        }

        /// <summary>
        /// Permet de retourner un tableau d'objet en lisant une ligne remonté de la requête
        /// </summary>
        /// <param name="dr">Ligne de données</param>
        /// <returns>Retourne un tableau d'objet formatté selon la disposition des colonnes de la table</returns>
        private static object[] FillJoueur(IDataReader dr)
        {
            object[] tab = new object[NB_COL_JOUEUR];
            tab[0] = Convert.ToInt32(dr[COL_BDD_ID_JOUEUR]);
            tab[1] = Convert.ToString(dr[COL_BDD_NOM_JOUEUR]);
            tab[2] = Convert.ToString(dr[COL_BDD_PRENOM_JOUEUR]);
            tab[3] = Convert.ToDateTime(dr[COL_BDD_DATENAISSANCE_JOUEUR]);
            tab[4] = Convert.ToInt32(dr[COL_BDD_POSTE_JOUEUR]);
            tab[5] = Convert.ToInt32(dr[COL_BDD_NOMBRE_SELECTIONS_JOUEUR]);
            tab[6] = Convert.ToInt32(dr[COL_BDD_SCORE_JOUEUR]);
            tab[7] = Convert.ToInt32(dr[COL_BDD_EQUIPE_ID_JOUEUR]);
            return tab;
        }

        /// <summary>
        /// Retourne une DataTable selon un requête passée en paramètre
        /// </summary>
        /// <param name="request">Requête demandée</param>
        /// <returns>Retourne les données associées à cette requête</returns>
        public static DataTable BuildDataTableByRequestForPlayer(String request)
        {
            DataTable dt = CreateDataTableJoueur();

            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                connection.Open();

                SqlCommand command = new SqlCommand(request, connection);

                SqlDataReader reader = command.ExecuteReader();

                while (reader.Read()) dt.LoadDataRow(FillJoueur(reader), true);

                connection.Close();
            }

            return dt;
        }

        /// <summary>
        /// Construit une ligne à partir d'un joueur
        /// </summary>
        /// <param name="coupe">Objet à transformer</param>
        /// <returns>Retourne un tableau d'objet dans l'odre des colonnes de la table Joueur</returns>
        public static object[] BuildRowByJoueur(Joueur joueur)
        {
            object[] tab = new object[NB_COL_JOUEUR];
            tab[0] = joueur.ID;
            tab[1] = joueur.Nom;
            tab[2] = joueur.Prenom;
            tab[3] = joueur.DateNaissance;
            tab[4] = joueur.Poste;
            tab[5] = joueur.NbSelection;
            tab[6] = joueur.Score;
            tab[7] = joueur.EquipeId;
            return tab;
        }

        /// <summary>
        /// Retourne le nom de la table
        /// </summary>
        /// <returns></returns>
        public String FromPlayer()
        {
            return TABLE_BDD_JOUEUR;
        }

        /// <summary>
        /// Retourne les champs de la table Player
        /// </summary>
        /// <returns></returns>
        public String ValuesPlayer()
        {
            return COL_BDD_ID_JOUEUR + "," + COL_BDD_NOM_JOUEUR + "," + COL_BDD_PRENOM_JOUEUR + "," + COL_BDD_DATENAISSANCE_JOUEUR + "," +
                    COL_BDD_POSTE_JOUEUR + "," + COL_BDD_NOMBRE_SELECTIONS_JOUEUR + "," + COL_BDD_SCORE_JOUEUR + "," + COL_BDD_EQUIPE_ID_JOUEUR;
        }

        #endregion

        #endregion

        #region Table Spectateur

        #region Constantes Table Spectateur
        // Constantes : Nom des tables, Nom de la table, Nombre de champs dans la table
        private const string TABLE_BDD_SPECTATEUR = "SPECTATEUR";
        private const int NB_COL_SPECTATEUR = 6;
        private const string COL_BDD_ID_SPECTATEUR = "ID";
        private const string COL_BDD_NOM_SPECTATEUR = "NOM";
        private const string COL_BDD_PRENOM_SPECTATEUR = "PRENOM";
        private const string COL_BDD_DATENAISSANCE_SPECTATEUR = "DATENAISSANCE";
        private const string COL_BDD_ADRESSE_SPECTATEUR = "ADRESSE";
        private const string COL_BDD_EMAIL_SPECTATEUR = "EMAIL";
        #endregion

        #region Méthodes Génériques Table Spectateur

        /// <summary>
        /// Permet d'initialiser une DataTable avec toutes les colonnes associés à la table Spectateur
        /// </summary>
        /// <returns>Retourne une DataTable correctement initialisé</returns>
        private static DataTable CreateDataTableSpectateur()
        {
            DataTable dt = new DataTable();
            dt.Columns.Add(COL_BDD_ID_SPECTATEUR, typeof(Int32));
            dt.Columns.Add(COL_BDD_NOM_SPECTATEUR, typeof(String));
            dt.Columns.Add(COL_BDD_PRENOM_SPECTATEUR, typeof(String));
            dt.Columns.Add(COL_BDD_DATENAISSANCE_SPECTATEUR, typeof(DateTime));
            dt.Columns.Add(COL_BDD_ADRESSE_SPECTATEUR, typeof(String));
            dt.Columns.Add(COL_BDD_EMAIL_SPECTATEUR, typeof(String));
            return dt;
        }

        /// <summary>
        /// Permet de retourner un tableau d'objet en lisant une ligne remonté de la requête
        /// </summary>
        /// <param name="dr">Ligne de données</param>
        /// <returns>Retourne un tableau d'objet formatté selon la disposition des colonnes de la table</returns>
        private static object[] FillSpectateur(IDataReader dr)
        {
            object[] tab = new object[NB_COL_SPECTATEUR];
            tab[0] = Convert.ToInt32(dr[COL_BDD_ID_SPECTATEUR]);
            tab[1] = Convert.ToString(dr[COL_BDD_NOM_SPECTATEUR]);
            tab[2] = Convert.ToString(dr[COL_BDD_PRENOM_SPECTATEUR]);
            tab[3] = Convert.ToDateTime(dr[COL_BDD_DATENAISSANCE_SPECTATEUR]);
            tab[4] = Convert.ToString(dr[COL_BDD_ADRESSE_SPECTATEUR]);
            tab[5] = Convert.ToString(dr[COL_BDD_EMAIL_SPECTATEUR]);
            return tab;
        }

        /// <summary>
        /// Retourne une DataTable selon un requête passée en paramètre
        /// </summary>
        /// <param name="request">Requête demandée</param>
        /// <returns>Retourne les données associées à cette requête</returns>
        public static DataTable BuildDataTableByRequestForSpectator(String request)
        {
            DataTable dt = CreateDataTableSpectateur();

            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                connection.Open();

                SqlCommand command = new SqlCommand(request, connection);

                SqlDataReader reader = command.ExecuteReader();

                while (reader.Read()) dt.LoadDataRow(FillSpectateur(reader), true);

                connection.Close();
            }

            return dt;
        }

        /// <summary>
        /// Construit une ligne à partir d'un spectateur
        /// </summary>
        /// <param name="coupe">Objet à transformer</param>
        /// <returns>Retourne un tableau d'objet dans l'odre des colonnes de la table Spectateur</returns>
        public static object[] BuildRowBySpectateur(Spectateur spectateur)
        {
            object[] tab = new object[NB_COL_SPECTATEUR];
            tab[0] = spectateur.ID;
            tab[1] = spectateur.Nom;
            tab[2] = spectateur.Prenom;
            tab[3] = spectateur.DateNaissance;
            tab[4] = spectateur.Adresse;
            tab[5] = spectateur.Email;
            return tab;
        }

        /// <summary>
        /// Retourne le nom de la table
        /// </summary>
        /// <returns></returns>
        public String FromSpectateur()
        {
            return TABLE_BDD_SPECTATEUR;
        }

        /// <summary>
        /// Retourne les champs de la table Spectateur
        /// </summary>
        /// <returns></returns>
        public String ValuesSpectateur()
        {
            return COL_BDD_ID_SPECTATEUR + "," + COL_BDD_NOM_SPECTATEUR + "," + COL_BDD_PRENOM_SPECTATEUR + "," + COL_BDD_DATENAISSANCE_SPECTATEUR + "," +
                    COL_BDD_ADRESSE_SPECTATEUR + "," + COL_BDD_EMAIL_SPECTATEUR;
        }

        #endregion

        #endregion

        #region Table Equipe

        #region Constantes Table Equipe
        // Constantes : Nom des tables, Nom de la table, Nombre de champs dans la table
        private const string TABLE_BDD_EQUIPE = "EQUIPE";
        private const int NB_COL_EQUIPE = 3;
        private const string COL_BDD_ID_EQUIPE = "ID";
        private const string COL_BDD_NOM_EQUIPE = "NOM";
        private const string COL_BDD_PAYS_EQUIPE = "PAYS";
        #endregion

        #region Méthodes Génériques Table Equipe

        /// <summary>
        /// Permet d'initialiser une DataTable avec toutes les colonnes associés à la table Equipe
        /// </summary>
        /// <returns>Retourne une DataTable correctement initialisé</returns>
        private static DataTable CreateDataTableEquipe()
        {
            DataTable dt = new DataTable();
            dt.Columns.Add(COL_BDD_ID_EQUIPE, typeof(Int32));
            dt.Columns.Add(COL_BDD_NOM_EQUIPE, typeof(String));
            dt.Columns.Add(COL_BDD_PAYS_EQUIPE, typeof(String));
            return dt;
        }

        /// <summary>
        /// Permet de retourner un tableau d'objet en lisant une ligne remonté de la requête
        /// </summary>
        /// <param name="dr">Ligne de données</param>
        /// <returns>Retourne un tableau d'objet formatté selon la disposition des colonnes de la table</returns>
        private static object[] FillEquipe(IDataReader dr)
        {
            object[] tab = new object[NB_COL_EQUIPE];
            tab[0] = Convert.ToInt32(dr[COL_BDD_ID_EQUIPE]);
            tab[1] = Convert.ToString(dr[COL_BDD_NOM_EQUIPE]);
            tab[2] = Convert.ToString(dr[COL_BDD_PAYS_EQUIPE]);
            return tab;
        }

        /// <summary>
        /// Retourne une DataTable selon un requête passée en paramètre
        /// </summary>
        /// <param name="request">Requête demandée</param>
        /// <returns>Retourne les données associées à cette requête</returns>
        public static DataTable BuildDataTableByRequestForTeams(String request)
        {
            DataTable dt = CreateDataTableEquipe();

            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                connection.Open();

                SqlCommand command = new SqlCommand(request, connection);

                SqlDataReader reader = command.ExecuteReader();

                while (reader.Read()) dt.LoadDataRow(FillEquipe(reader), true);

                connection.Close();
            }

            return dt;
        }

        /// <summary>
        /// Construit une ligne à partir d'une équipe
        /// </summary>
        /// <param name="coupe">Objet à transformer</param>
        /// <returns>Retourne un tableau d'objet dans l'odre des colonnes de la table Equipe</returns>
        public static object[] BuildRowByEquipe(Equipe equipe)
        {
            object[] tab = new object[NB_COL_EQUIPE];
            tab[0] = equipe.ID;
            tab[1] = equipe.Nom;
            tab[2] = equipe.Pays;
            return tab;
        }

        /// <summary>
        /// Retourne le nom de la table
        /// </summary>
        /// <returns></returns>
        public String FromEquipe()
        {
            return TABLE_BDD_EQUIPE;
        }

        /// <summary>
        /// Retourne les champs de la table Equipe
        /// </summary>
        /// <returns></returns>
        public String ValuesEquipe()
        {
            return COL_BDD_ID_EQUIPE + "," + COL_BDD_NOM_EQUIPE + "," + COL_BDD_PAYS_EQUIPE;
        }

        #endregion

        #endregion

        #region Table Match

        #region Constantes Table Match
        // Constantes : Nom des tables, Nom de la table, Nombre de champs dans la table
        private const string TABLE_BDD_MATCH = "MATCH";
        private const int NB_COL_MATCH = 9;
        private const string COL_BDD_ID_MATCH = "ID";
        private const string COL_BDD_DATE_MATCH = "DATE";
        private const string COL_BDD_PRIX_MATCH = "PRIX";
        private const string COL_BDD_COUPE_ID_MATCH = "COUPEID";
        private const string COL_BDD_EQUIPE_DOM_MATCH = "EQUIPEDOMICILE";
        private const string COL_BDD_EQUIPE_VIS_MATCH = "EQUIPEVISITEUSE";
        private const string COL_BDD_SCORE_EQUIPE_DOM_MATCH = "SCOREEQUIPEDOMICILE";
        private const string COL_BDD_SCORE_EQUIPE_VIS_MATCH = "SCOREEQUIPEVISITEUSE";
        private const string COL_BDD_STADE_MATCH = "STADE";

        #endregion

        #region Méthodes Génériques Table Match

        /// <summary>
        /// Permet d'initialiser une DataTable avec toutes les colonnes associés à la table Joueur
        /// </summary>
        /// <returns>Retourne une DataTable correctement initialisé</returns>
        private static DataTable CreateDataTableMatch()
        {
            DataTable dt = new DataTable();
            dt.Columns.Add(COL_BDD_ID_MATCH, typeof(Int32));
            dt.Columns.Add(COL_BDD_DATE_MATCH, typeof(DateTime));
            dt.Columns.Add(COL_BDD_PRIX_MATCH, typeof(float));
            dt.Columns.Add(COL_BDD_COUPE_ID_MATCH, typeof(Int32));
            dt.Columns.Add(COL_BDD_EQUIPE_DOM_MATCH, typeof(Int32));
            dt.Columns.Add(COL_BDD_EQUIPE_VIS_MATCH, typeof(Int32));
            dt.Columns.Add(COL_BDD_SCORE_EQUIPE_DOM_MATCH, typeof(Int32));
            dt.Columns.Add(COL_BDD_SCORE_EQUIPE_VIS_MATCH, typeof(Int32));
            dt.Columns.Add(COL_BDD_STADE_MATCH, typeof(Int32));
            return dt;
        }

        /// <summary>
        /// Permet de retourner un tableau d'objet en lisant une ligne remonté de la requête
        /// </summary>
        /// <param name="dr">Ligne de données</param>
        /// <returns>Retourne un tableau d'objet formatté selon la disposition des colonnes de la table</returns>
        private static object[] FillMatch(IDataReader dr)
        {
            object[] tab = new object[NB_COL_MATCH];
            tab[0] = Convert.ToInt32(dr[COL_BDD_ID_MATCH]);
            tab[1] = Convert.ToDateTime(dr[COL_BDD_DATE_MATCH]);
            tab[2] = Convert.ToDouble(dr[COL_BDD_PRIX_MATCH]);
            tab[3] = Convert.ToInt32(dr[COL_BDD_COUPE_ID_MATCH]);
            tab[4] = Convert.ToInt32(dr[COL_BDD_EQUIPE_DOM_MATCH]);
            tab[5] = Convert.ToInt32(dr[COL_BDD_EQUIPE_VIS_MATCH]);
            tab[6] = Convert.ToInt32(dr[COL_BDD_SCORE_EQUIPE_DOM_MATCH]);
            tab[7] = Convert.ToInt32(dr[COL_BDD_SCORE_EQUIPE_VIS_MATCH]);
            tab[8] = Convert.ToInt32(dr[COL_BDD_STADE_MATCH]);
            return tab;
        }

        /// <summary>
        /// Retourne une DataTable selon un requête passée en paramètre
        /// </summary>
        /// <param name="request">Requête demandée</param>
        /// <returns>Retourne les données associées à cette requête</returns>
        public static DataTable BuildDataTableByRequestForMatch(String request)
        {
            DataTable dt = CreateDataTableMatch();

            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                connection.Open();

                SqlCommand command = new SqlCommand(request, connection);

                SqlDataReader reader = command.ExecuteReader();

                while (reader.Read()) dt.LoadDataRow(FillMatch(reader), true);

                connection.Close();
            }

            return dt;
        }

        /// <summary>
        /// Construit une ligne à partir d'un match
        /// </summary>
        /// <param name="coupe">Objet à transformer</param>
        /// <returns>Retourne un tableau d'objet dans l'odre des colonnes de la table Match</returns>
        public static object[] BuildRowByMatch(Match match)
        {
            object[] tab = new object[NB_COL_MATCH];
            tab[0] = match.ID;
            tab[1] = match.Date;
            tab[2] = match.Prix;
            tab[3] = match.CoupeID;
            tab[4] = match.EquipeDomicile.ID;
            tab[5] = match.EquipeVisiteuse.ID;
            tab[6] = match.ScoreEquipeDomicile;
            tab[7] = match.ScoreEquipeVisiteuse;
            tab[8] = match.Stade.ID;
            return tab;
        }

        /// <summary>
        /// Retourne le nom de la table
        /// </summary>
        /// <returns></returns>
        public String FromMatch()
        {
            return TABLE_BDD_MATCH;
        }

        /// <summary>
        /// Retourne les champs de la table Match
        /// </summary>
        /// <returns></returns>
        public String ValuesMatch()
        {
            return COL_BDD_ID_MATCH + "," + COL_BDD_DATE_MATCH + "," + COL_BDD_PRIX_MATCH + "," + COL_BDD_COUPE_ID_MATCH + "," +
                    COL_BDD_EQUIPE_DOM_MATCH + "," + COL_BDD_EQUIPE_VIS_MATCH + "," + COL_BDD_SCORE_EQUIPE_DOM_MATCH + "," + 
                    COL_BDD_SCORE_EQUIPE_VIS_MATCH + "," + COL_BDD_STADE_MATCH;
        }

        #endregion

        #endregion

        #region Table Reservation

        #region Constantes Table Reservation
        // Constantes : Nom des tables, Nom de la table, Nombre de champs dans la table
        private const string TABLE_BDD_RESERVATION = "RESERVATION";
        private const int NB_COL_RESERVATION = 5;
        private const string COL_BDD_ID_RESERVATION = "ID";
        private const string COL_BDD_MATCH_ID_RESERVATION = "MATCH";
        private const string COL_BDD_COUPE_ID_RESERVATION = "COUPE";
        private const string COL_BDD_SPECTATEUR_ID_RESERVATION = "SPECTATEUR";
        private const string COL_BDD_NBR_PLACES_RESERVATION = "NOMBREPLACESRESERVEES";
        #endregion

        #region Méthodes Génériques Table Reservation

        /// <summary>
        /// Permet d'initialiser une DataTable avec toutes les colonnes associés à la table Reservation
        /// </summary>
        /// <returns>Retourne une DataTable correctement initialisé</returns>
        private static DataTable CreateDataTableReservation()
        {
            DataTable dt = new DataTable();
            dt.Columns.Add(COL_BDD_ID_RESERVATION, typeof(Int32));
            dt.Columns.Add(COL_BDD_MATCH_ID_RESERVATION, typeof(Int32));
            dt.Columns.Add(COL_BDD_COUPE_ID_RESERVATION, typeof(Int32));
            dt.Columns.Add(COL_BDD_SPECTATEUR_ID_RESERVATION, typeof(Int32));
            dt.Columns.Add(COL_BDD_NBR_PLACES_RESERVATION, typeof(Int32));
            return dt;
        }

        /// <summary>
        /// Permet de retourner un tableau d'objet en lisant une ligne remonté de la requête
        /// </summary>
        /// <param name="dr">Ligne de données</param>
        /// <returns>Retourne un tableau d'objet formatté selon la disposition des colonnes de la table</returns>
        private static object[] FillReservation(IDataReader dr)
        {
            object[] tab = new object[NB_COL_RESERVATION];
            tab[0] = Convert.ToInt32(dr[COL_BDD_MATCH_ID_RESERVATION]);
            tab[1] = Convert.ToInt32(dr[COL_BDD_COUPE_ID_RESERVATION]);
            tab[2] = Convert.ToInt32(dr[COL_BDD_SPECTATEUR_ID_RESERVATION]);
            tab[3] = Convert.ToInt32(dr[COL_BDD_COUPE_ID_RESERVATION]);
            tab[4] = Convert.ToInt32(dr[COL_BDD_NBR_PLACES_RESERVATION]);
            return tab;
        }

        /// <summary>
        /// Retourne une DataTable selon un requête passée en paramètre
        /// </summary>
        /// <param name="request">Requête demandée</param>
        /// <returns>Retourne les données associées à cette requête</returns>
        public static DataTable BuildDataTableByRequestForReservation(String request)
        {
            DataTable dt = CreateDataTableReservation();

            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                connection.Open();

                SqlCommand command = new SqlCommand(request, connection);

                SqlDataReader reader = command.ExecuteReader();

                while (reader.Read()) dt.LoadDataRow(FillReservation(reader), true);

                connection.Close();
            }

            return dt;
        }

        /// <summary>
        /// Construit une ligne à partir d'une reservation
        /// </summary>
        /// <param name="coupe">Objet à transformer</param>
        /// <returns>Retourne un tableau d'objet dans l'odre des colonnes de la table Reservation</returns>
        public static object[] BuildRowByReservation(Reservation reservation)
        {
            object[] tab = new object[NB_COL_RESERVATION];
            tab[0] = reservation.ID;
            tab[1] = reservation.Match.ID;
            tab[2] = reservation.IDCoupe;
            tab[3] = reservation.Spectateur.ID;
            tab[4] = reservation.NombrePlacesReserves;
            return tab;
        }

        /// <summary>
        /// Retourne le nom de la table
        /// </summary>
        /// <returns></returns>
        public String FromReservation()
        {
            return TABLE_BDD_RESERVATION;
        }

        /// <summary>
        /// Retourne les champs de la table Match
        /// </summary>
        /// <returns></returns>
        public String ValuesReservation()
        {
            return COL_BDD_ID_RESERVATION + "," + COL_BDD_MATCH_ID_RESERVATION + "," + COL_BDD_COUPE_ID_RESERVATION + "," + COL_BDD_SPECTATEUR_ID_RESERVATION + "," +
                    COL_BDD_NBR_PLACES_RESERVATION;
        }

        #endregion

        #endregion

        #region Table Stade

        #region Constantes Table Stade
        // Constantes : Nom des tables, Nom de la table, Nombre de champs dans la table
        private const string TABLE_BDD_STADE = "STADE";
        private const int NB_COL_STADE = 5;
        private const string COL_BDD_ID_STADE = "ID";
        private const string COL_BDD_NOM_STADE = "NOM";
        private const string COL_BDD_ADRESSE_STADE = "ADRESSE";
        private const string COL_BDD_NB_PLACES_STADE = "NOMBREPLACES";
        private const string COL_BDD_POURCENT_COMISSION_STADE = "POURCENTAGECOMISSION";
        #endregion

        #region Méthodes Génériques Table Stade

        /// <summary>
        /// Permet d'initialiser une DataTable avec toutes les colonnes associés à la table Stade
        /// </summary>
        /// <returns>Retourne une DataTable correctement initialisé</returns>
        private static DataTable CreateDataTableStade()
        {
            DataTable dt = new DataTable();
            dt.Columns.Add(COL_BDD_ID_STADE, typeof(Int32));
            dt.Columns.Add(COL_BDD_NOM_STADE, typeof(String));
            dt.Columns.Add(COL_BDD_ADRESSE_STADE, typeof(String));
            dt.Columns.Add(COL_BDD_NB_PLACES_STADE, typeof(Int32));
            dt.Columns.Add(COL_BDD_POURCENT_COMISSION_STADE, typeof(double));
            return dt;
        }

        /// <summary>
        /// Permet de retourner un tableau d'objet en lisant une ligne remonté de la requête
        /// </summary>
        /// <param name="dr">Ligne de données</param>
        /// <returns>Retourne un tableau d'objet formatté selon la disposition des colonnes de la table</returns>
        private static object[] FillStade(IDataReader dr)
        {
            object[] tab = new object[NB_COL_STADE];
            tab[0] = Convert.ToInt32(dr[COL_BDD_ID_STADE]);
            tab[1] = Convert.ToString(dr[COL_BDD_NOM_STADE]);
            tab[2] = Convert.ToString(dr[COL_BDD_ADRESSE_STADE]);
            tab[3] = Convert.ToInt32(dr[COL_BDD_NB_PLACES_STADE]);
            tab[4] = Convert.ToDouble(dr[COL_BDD_POURCENT_COMISSION_STADE]);
            return tab;
        }

        /// <summary>
        /// Retourne une DataTable selon un requête passée en paramètre
        /// </summary>
        /// <param name="request">Requête demandée</param>
        /// <returns>Retourne les données associées à cette requête</returns>
        public static DataTable BuildDataTableByRequestForStade(String request)
        {
            DataTable dt = CreateDataTableStade();

            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                connection.Open();

                SqlCommand command = new SqlCommand(request, connection);

                SqlDataReader reader = command.ExecuteReader();

                while (reader.Read()) dt.LoadDataRow(FillStade(reader), true);

                connection.Close();
            }

            return dt;
        }

        /// <summary>
        /// Construit une ligne à partir d'un stade
        /// </summary>
        /// <param name="coupe">Objet à transformer</param>
        /// <returns>Retourne un tableau d'objet dans l'odre des colonnes de la table Stade</returns>
        public static object[] BuildRowByStade(Stade stade)
        {
            object[] tab = new object[NB_COL_STADE];
            tab[0] = stade.ID;
            tab[1] = stade.Nom;
            tab[2] = stade.Addresse;
            tab[3] = stade.NbPlaces;
            tab[4] = stade.PourcentageComission;
            return tab;
        }

        /// <summary>
        /// Retourne le nom de la table
        /// </summary>
        /// <returns></returns>
        public String FromStade()
        {
            return TABLE_BDD_STADE;
        }

        /// <summary>
        /// Retourne les champs de la table Match
        /// </summary>
        /// <returns></returns>
        public String ValuesStade()
        {
            return COL_BDD_ID_STADE + "," + COL_BDD_NOM_STADE + "," + COL_BDD_ADRESSE_STADE + "," + COL_BDD_NB_PLACES_STADE + "," +
                    COL_BDD_POURCENT_COMISSION_STADE;
        }

        #endregion
        
        #endregion

    }
}
